﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
//using ENProyectoSIETE;
//using CADProyectoSIETE;
using ENProyecto7;
using System.IO;


namespace ProyectoSIETE
{
    public partial class frmGestionLocalizaciones : Form
    {
        // Crear los arraylist donde se insertaran temporalmente los objetos y enemigos de las localizaciones
        private ArrayList enemigos = new ArrayList();
        private ArrayList objetos = new ArrayList();
        private BindingSource bsEn;
        private BindingSource bsOb;
        // Rutas de las imágenes de mapa y localizacion
        private string rutaLocalizacion;
        private string rutaMapa;

        private bool editando = false;

        private string directorioImagenes = @"..\..\..\WebProyectoSiete\img\";

        public frmGestionLocalizaciones()
        {
            InitializeComponent();
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: esta línea de código carga datos en la tabla 'bDProyecto7DataSet.Localizacion' Puede moverla o quitarla según sea necesario.
            //this.localizacionTableAdapter.Fill(this.bDProyecto7DataSet.Localizacion);
            // TODO: esta línea de código carga datos en la tabla 'bDProyecto7DataSet.Objeto' Puede moverla o quitarla según sea necesario.
            //this.objetoTableAdapter.Fill(this.bDProyecto7DataSet.Objeto);
            // TODO: esta línea de código carga datos en la tabla 'bDProyecto7DataSet.Enemigo' Puede moverla o quitarla según sea necesario.
            //this.enemigoTableAdapter.Fill(this.bDProyecto7DataSet.Enemigo);


            try
            {
                ENLocalizacion localizacion = new ENLocalizacion();
                dgvLocalizaciones.DataSource = localizacion.obtenerLocalizaciones();

                ENEnemigo enemigo = new ENEnemigo();

                DataTable tablaenemigo = enemigo.obtenerEnemigos();
                dataGridView1.DataSource = tablaenemigo;
                
                if(tablaenemigo.Rows.Count > 0){}
                    //dataGridView1.Columns[0].Visible = false;

                ENObjeto objeto = new ENObjeto();

                DataTable tablaobjeto = objeto.obtenerObjetos().Tables["objeto"];
                dataGridView4.DataSource = tablaobjeto;
                if (tablaobjeto.Rows.Count > 0) { }
                    //dataGridView4.Columns[0].Visible = false;
            }
            catch
            {
                MessageBox.Show("Se ha producido un error al intentar cargar el formulario");
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {

        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            if (editando)
            {
                epError.SetError(tbNombre, "");
                epError.SetError(label2, "");
                epError.SetError(label3, "");

                bool error = false;

                string patronNombre = @"^[A-Z]{1}[a-zA-Z0-9]+$";

                // Controlar que el nombre está rellenado y que tenga un formato válido
                if (tbNombre.Text != "")
                {
                    if (!(Regex.Match(tbNombre.Text, patronNombre).Success))
                    {
                        epError.SetError(tbNombre, "Sólo se admiten carácteres para el nombre, y debe comenzar por una mayúscula.");
                        error = true;
                    }
                }
                else
                {
                    epError.SetError(tbNombre, "La localización debe tener nombre.");
                    error = true;
                }
                // Comprobar que se haya subido una imagen para localización
                if (rutaLocalizacion == null)
                {
                    epError.SetError(label2, "Debes subir una imagen para la localización.");
                    error = true;
                }
                // Comprobar que se haya subido una imagen para mapa
                if (rutaMapa == null)
                {
                    epError.SetError(label3, "Debes subir una imagen para el mapa.");
                    error = true;
                }
                // Si no se ha cometido ningún error, se pueden guardar los datos en la bd
                if (!error)
                {
                    try
                    {
                        ENLocalizacion localizacion = new ENLocalizacion();

                        string[] ficheroFondo = rutaLocalizacion.Split(new char[] { '\\' });
                        string imagenFondo = ficheroFondo[ficheroFondo.Length - 1];

                        string[] ficheroLocalizacion = rutaMapa.Split(new char[] { '\\' });
                        string imagenLocalizacion = ficheroLocalizacion[ficheroLocalizacion.Length - 1];

                        dgvLocalizaciones.DataSource = localizacion.obtenerLocalizaciones();

                        localizacion.IdLocalizacion = int.Parse(lbIdLocalizacion.Text);
                        localizacion.DescripcionLocalizacion = tbDescLug.Text;
                        localizacion.FondoLocalizacion = imagenFondo;
                        localizacion.NombreLocalizacion = tbNombre.Text;
                        localizacion.ImagenLocalizacion = imagenLocalizacion;
                        localizacion.EnemigosLocalizacion = enemigos;
                        localizacion.ObjetosLocalizacion = objetos;

                        localizacion.editarLocalizacion();


                        string ficheroDestinoFondo = Path.Combine(directorioImagenes, imagenFondo);

                        if (rutaLocalizacion != "")
                        {
                            File.Copy(rutaLocalizacion, ficheroDestinoFondo, true);
                        }

                        string ficheroDestinoLocalizacion = Path.Combine(directorioImagenes, imagenLocalizacion);

                        if(rutaMapa != "")
                        {
                            File.Copy(rutaMapa, ficheroDestinoLocalizacion, true);
                        }
                    }
                    catch
                    {
                        MessageBox.Show("Se ha producido un error al intentar editar el enemigo");
                    }

                }
            }
            else{

                epError.SetError(tbNombre, "");
                epError.SetError(label2, "");
                epError.SetError(label3, "");

                bool error = false;

                string patronNombre = @"^[A-Z]{1}[a-zA-Z0-9]+$";

                // Controlar que el nombre está rellenado y que tenga un formato válido
                if (tbNombre.Text != "")
                {
                    if(!(Regex.Match(tbNombre.Text,patronNombre).Success)){
                        epError.SetError(tbNombre, "Sólo se admiten carácteres para el nombre, y debe comenzar por una mayúscula.");
                        error = true;
                    }
                }
                else 
                {
                    epError.SetError(tbNombre, "La localización debe tener nombre.");
                    error = true;
                }
                // Comprobar que se haya subido una imagen para localización
                if (rutaLocalizacion == null)
                {
                    epError.SetError(label2, "Debes subir una imagen para la localización.");
                    error = true;
                }
                // Comprobar que se haya subido una imagen para mapa
                if (rutaMapa == null)
                {
                    epError.SetError(label3, "Debes subir una imagen para el mapa.");
                    error = true;
                }
                // Si no se ha cometido ningún error, se pueden guardar los datos en la bd
                if (!error)
                {
                    try
                    {
                        ENLocalizacion localizacion = new ENLocalizacion();

                        localizacion.DescripcionLocalizacion = tbDescLug.Text;
                        localizacion.FondoLocalizacion = rutaLocalizacion;
                        localizacion.NombreLocalizacion = tbNombre.Text;
                        localizacion.ImagenLocalizacion = rutaMapa;
                        localizacion.EnemigosLocalizacion = enemigos;
                        localizacion.ObjetosLocalizacion = objetos;

                        localizacion.insertarLocalizacion();

                        
                        dgvLocalizaciones.DataSource = localizacion.obtenerLocalizaciones();
                        
                    }
                    catch
                    {
                        MessageBox.Show("Se ha producido un error al crear el enemigo");
                    }

                }

            }
        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            epError.SetError(tbPorcEne, "");
            if (tbPorcEne.Text != "")
            {
                string patron = "[0-9]+";
                // Si el porcentaje es un número
                if (Regex.Match(tbPorcEne.Text, patron).Success)
                {
                    ENEnemigosLocalizacion enemigo = new ENEnemigosLocalizacion();
                    try
                    {
                        enemigo.Nombre = dataGridView1.CurrentRow.Cells[0].Value.ToString();
                        enemigo.IDEnemigo = int.Parse(dataGridView1.CurrentRow.Cells[1].Value.ToString());
                        enemigo.Porcentaje = int.Parse(tbPorcEne.Text);
                        // Si se pasa del 100 % se iguala automáticamente
                        if (enemigo.Porcentaje > 100) {
                            enemigo.Porcentaje = 100; 
                        }
                        else if (enemigo.Porcentaje < 1)
                        {
                            enemigo.Porcentaje = 1;
                        }

                        enemigos.Add(enemigo);
                        // Insertar los enemigos en el data grid
                        bsEn = new BindingSource(enemigos, "");
                        
                        dataGridView2.DataSource = bsEn;
                        dataGridView2.Columns[0].Visible = false;

                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "ERROR");
                    }
                }
                else
                {
                    epError.SetError(tbPorcEne, "Debes introducir un número.");
                }
            }
            else {
                epError.SetError(tbPorcEne, "Debes introducir un número.");
            }
        }

        private void btnAddObjeto_Click(object sender, EventArgs e)
        {
            epError.SetError(tbPorcObj, "");
            if (tbPorcObj.Text != "")
            {
                string patron = "[0-9]+";
                // Si el porcentaje es un número
                if (Regex.Match(tbPorcObj.Text, patron).Success)
                {
                    ENObjetoLocalizacion objeto = new ENObjetoLocalizacion();
                    try
                    {
                        objeto.Nombre = dataGridView4.CurrentRow.Cells[0].Value.ToString();
                        objeto.IDObjeto = int.Parse(dataGridView4.CurrentRow.Cells[1].Value.ToString());
                        objeto.Porcentaje = int.Parse(tbPorcObj.Text);
                        // Si se pasa del 100 % se iguala automáticamente
                        if (objeto.Porcentaje > 100) { objeto.Porcentaje = 100; }

                        if (objeto.Porcentaje < 1) { objeto.Porcentaje = 1; }

                        objetos.Add(objeto);
                        // Insertar los enemigos en el data grid
                        bsOb = new BindingSource(objetos, "");
                        dataGridView3.DataSource = bsOb;
                        dataGridView3.Columns[0].Visible = false;

                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "ERROR");
                    }
                }
                else
                {
                    epError.SetError(tbPorcObj, "Debes introducir un número.");
                }
            }
            else
            {
                epError.SetError(tbPorcObj,"Debes introducir un número.");
            }
        }

        private void btnSubLoc_Click(object sender, EventArgs e)
        {
            DialogResult resultado = ofdSubirLocalizacion.ShowDialog();
            if (resultado == DialogResult.OK)
            {
                rutaLocalizacion = ofdSubirLocalizacion.FileName;
                pbLocalizacion.ImageLocation = ofdSubirLocalizacion.FileName;
            }
        }

        private void gbInformacionBasica_Enter(object sender, EventArgs e)
        {

        }

        private void btnFond_Click(object sender, EventArgs e)
        {
            DialogResult resultado = ofdSubirMapa.ShowDialog();
            if (resultado == DialogResult.OK)
            {
                rutaMapa = ofdSubirMapa.FileName;
                pbMapa.ImageLocation = ofdSubirMapa.FileName;
            }

        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnBorrarLoc_Click(object sender, EventArgs e)
        {
        }

        private void btnBorrar_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Desea borrar la localización " + dgvLocalizaciones.CurrentRow.Cells[1].Value.ToString() + "?", "Confirmar borrar", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                try
                {
                    ENLocalizacion localizacion = new ENLocalizacion();
                    localizacion.IdLocalizacion = int.Parse(dgvLocalizaciones.CurrentRow.Cells[0].Value.ToString());
                    localizacion.borrarLocalizacion();
                    //Borramos los ArrayList auxiliares
                    enemigos.Clear();
                    objetos.Clear();

                    bsEn = new BindingSource(enemigos, "");
                    bsOb = new BindingSource(objetos, "");

                    dataGridView2.DataSource = bsEn;

                    dataGridView3.DataSource = bsOb;

                    dgvLocalizaciones.DataSource = localizacion.obtenerLocalizaciones();

                    MessageBox.Show("Localización borrada.", "", MessageBoxButtons.OK);

                    editando = false;

                    tbDescLug.Text = "";
                    tbNombre.Text = "";
                    tbPorcEne.Text = "";
                    tbPorcObj.Text = "";
                    pbLocalizacion.ImageLocation = "";
                    pbMapa.ImageLocation = "";

                    //Limpiamos el formulario
                    enemigos.Clear();
                    objetos.Clear();

                    bsEn = new BindingSource(enemigos, "");
                    bsOb = new BindingSource(objetos, "");

                    dataGridView2.DataSource = bsEn;

                    dataGridView3.DataSource = bsOb;

                    editando = false;
                    
                }
                catch
                {
                    MessageBox.Show("Se ha producido un error al intentar borrar la localizacion");
                }
            }
        }

        private void tbBuscar_MouseClick(object sender, MouseEventArgs e)
        {
            tbBuscar.Text = "";
        }

        private void btBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                DataTable resultado = new DataTable();
                ENLocalizacion localizacion = new ENLocalizacion();

                localizacion.NombreLocalizacion = tbBuscar.Text;

                resultado = localizacion.obtenerLocalizacionNombre("nombre");

                if (resultado.Rows.Count == 0)
                {
                    MessageBox.Show("No se ha encontrado ninguna coincidencia");
                }
                else
                {
                    //int i = 0;
                    //bool encontrado = false;

                    //Deseleccionamos las filas que pudieran estar seleccionadas anteriormente
                    //dgvEnemigo.ClearSelection();

                    dgvLocalizaciones.DataSource = resultado;
                    dgvLocalizaciones.Refresh();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK);
            }
        }

        private void btnNuevo_Click(object sender, EventArgs e)
        {
            tbDescLug.Text = "";
            tbNombre.Text = "";
            tbPorcEne.Text = "";
            tbPorcObj.Text = "";
            pbLocalizacion.ImageLocation = "";
            pbMapa.ImageLocation = "";

            try
            {
                enemigos.Clear();
                objetos.Clear();                

                bsEn = new BindingSource(enemigos, "");
                bsOb = new BindingSource(objetos, "");

                dataGridView2.DataSource = bsEn;
                
                dataGridView3.DataSource = bsOb;
                
                editando = false;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private void dgvLocalizaciones_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                editando = true;

                ENLocalizacion localizacion = new ENLocalizacion();

                localizacion.IdLocalizacion = int.Parse(dgvLocalizaciones.CurrentRow.Cells[0].Value.ToString());

                localizacion.obtenerLocalizacion();

                tbNombre.Text = localizacion.NombreLocalizacion;
                tbDescLug.Text = localizacion.DescripcionLocalizacion;
                lbIdLocalizacion.Text = localizacion.IdLocalizacion.ToString();

                
                enemigos = localizacion.EnemigosLocalizacion;

                //Actualizamos el DataGrid de enemigos
                bsEn = new BindingSource(enemigos, "");

                dataGridView2.DataSource = bsEn;

                //Escondemos el ID, comprobamos que haya filas para que no se produzca error
                if(enemigos.Count > 0){
                    dataGridView2.Columns[0].Visible = false;
                }

                //Recuperamos los objetos asociados a la localizacion
                objetos = localizacion.ObjetosLocalizacion;

                //Actualizamos el DataGrid de objetos
                bsOb = new BindingSource(objetos, "");

                dataGridView3.DataSource = bsOb;

                //Escondemos el ID, comprobamos que haya filas para que no se produzca error
                if (objetos.Count > 0)
                {
                    dataGridView3.Columns[0].Visible = false;
                }

                string imagenFondo = localizacion.FondoLocalizacion;
                string imagenMapa = localizacion.ImagenLocalizacion;

                if (File.Exists(directorioImagenes + imagenFondo))
                    pbLocalizacion.ImageLocation = directorioImagenes + imagenFondo;
                else
                    pbLocalizacion.ImageLocation = directorioImagenes + "sin_imagen.png";

                if (File.Exists(directorioImagenes + imagenMapa))
                    pbMapa.ImageLocation = directorioImagenes + imagenMapa;
                else
                    pbMapa.ImageLocation = directorioImagenes + "sin_imagen.png";
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                //MessageBox.Show("Se ha producido un error al intentar cargar la localización");
            }


        }

        private void frmGestionLocalizaciones_Enter(object sender, EventArgs e)
        {
            try
            {
                ENLocalizacion localizacion = new ENLocalizacion();
                dgvLocalizaciones.DataSource = localizacion.obtenerLocalizaciones();

                ENEnemigo enemigo = new ENEnemigo();

                DataTable tablaenemigo = enemigo.obtenerEnemigos();
                dataGridView1.DataSource = tablaenemigo;
                if (tablaenemigo.Rows.Count > 0) { }
                    //dataGridView1.Columns[0].Visible = false;

                ENObjeto objeto = new ENObjeto();

                DataTable tablaobjeto = objeto.obtenerObjetos().Tables["objeto"];
                dataGridView4.DataSource = tablaobjeto;
                if (tablaobjeto.Rows.Count > 0){}
                    //dataGridView4.Columns[0].Visible = false;
            }
            catch
            {
                MessageBox.Show("Se ha producido un error al intentar cargar el formulario");
            }
        }
    }
}
